博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
10.Spring MVC4.1-异步请求处理(包含兼容浏览器的服务器端推送)
阅读量:4118 次
发布时间:2019-05-25

本文共 4338 字,大约阅读时间需要 14 分钟。

  • Servlet 3开始支持异步请求处理
  • Spring MVC 3.2开始支持Servlet3的这项特性
  • controller可以从另外一个线程返回一个java.util.concurrent.Callable,而不是一个简单的值
    • 此时Servlet容器线程已经释放,可以处理其他的请求
    • Spring MVC通过借助TaskExecutor调起另外一个线程(例子中的mvcTaskExecutor)
  • controller也可以从另外一个线程返回一个DeferredResult
    • 此时,Spring MVC并不知道这个线程的存在
    • 比如一个定时任务

10.2 演示

  • 05点睛Spring MVC 4.1-服务器端推送中,我们也演示了通过SSE实现长连接

    • 但在IE的一些版本是不支持的
  • 本例通过Spring MVC对异步处理的支持来演示长连接的支持,即服务器端推送

    • 支持所有浏览器
  • Servlet开启异步支持

package com.wisely;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRegistration.Dynamic;import org.springframework.web.WebApplicationInitializer;import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;import org.springframework.web.servlet.DispatcherServlet;public class WebInitializer implements WebApplicationInitializer {    @Override    public void onStartup(ServletContext servletContext)            throws ServletException {            AnnotationConfigWebApplicationContext ctx =                                      new AnnotationConfigWebApplicationContext();              ctx.register(DemoMVCConfig.class);             //注册spring mvc的DispatcherServlet            ctx.setServletContext(servletContext);                Dynamic servlet =                    servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));              servlet.addMapping("/");              servlet.setLoadOnStartup(1);            servlet.setAsyncSupported(true);//此句开启    }}
  • DeferredResult所需的定时处理
package com.wisely.service;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Service;import org.springframework.web.context.request.async.DeferredResult;@Servicepublic class AysncService {    private DeferredResult
deferredResult; public DeferredResult
getAsyncUpdate() { deferredResult = new DeferredResult
(); return deferredResult; } @Scheduled(fixedDelay = 5000) public void refresh() { if (deferredResult != null) { deferredResult.setResult(new Long(System.currentTimeMillis()) .toString()); } }}
  • 开启Spring MVC支持配置:继承WebMvcConfigurerAdapter的配置类DemoMVCConfig
@Override  public void configureAsyncSupport(AsyncSupportConfigurer configurer) {       configurer.setDefaultTimeout(30*1000L); //tomcat默认10秒       configurer.setTaskExecutor(mvcTaskExecutor());//所借助的TaskExecutor   }   @Bean   public ThreadPoolTaskExecutor mvcTaskExecutor(){        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        executor.setCorePoolSize(10);        executor.setQueueCapacity(100);        executor.setMaxPoolSize(25);        return executor;    }     @Override   public void addViewControllers(ViewControllerRegistry registry) {       registry.addViewController("/async").setViewName("/async");   }
  • 测试控制器
package com.wisely.web;import java.util.concurrent.Callable;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.context.request.async.DeferredResult;import com.wisely.service.AysncService;@Controllerpublic class AysncController {    @Autowired    AysncService aysncService;    @RequestMapping("/call")    @ResponseBody    public Callable
asyncCall() { //借助mvcTaskExecutor在另外一个线程调用 //此时Servlet容器线程已经释放,可以处理其他的请求 return new Callable
() { @Override public String call() throws Exception { Thread.sleep(3000); return "Async Hello World"; } }; } @RequestMapping("/defer") @ResponseBody public DeferredResult
deferredCall() { //调用aysncService的getAsyncUpdate方法 //deferredResult被计划任务每五秒钟更新一次 return aysncService.getAsyncUpdate(); }}
  • 测试页面
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
Insert title here">
  • 测试

    • 访问http://localhost:8080/testSpringMVC/async
    • 点击call

    • 点击defer

   

转载地址:http://ojcpi.baihongyu.com/

你可能感兴趣的文章
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
弱类型、强类型、动态类型、静态类型语言的区别是什么?
查看>>
Struts2技术内幕图书 转载
查看>>
Java异常分类
查看>>
项目中的jackson与json-lib使用比较
查看>>
Jackson Tree Model Example
查看>>
j2ee-验证码
查看>>
日志框架logj的使用
查看>>
js-高德地图规划路线
查看>>
常用js收集
查看>>
mydata97的日期控件
查看>>
如何防止sql注入
查看>>
maven多工程构建与打包
查看>>
springmvc传值
查看>>
Java 集合学习一 HashSet
查看>>
在Eclipse中查看Android源码
查看>>
Android-Socket登录实例
查看>>
Android使用webservice客户端实例
查看>>
层在页面中的定位
查看>>
[转]C语言printf
查看>>